    const fileDownload = {
        /**
         * 执行下载操作
         */
        downloadEvt(url, fileName = '未知文件') {
            const el = document.createElement('a');
            el.style.display = 'none';
            el.setAttribute('target', '_blank');
            /**
             * download的属性是HTML5新增的属性
             * href属性的地址必须是非跨域的地址，如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口)，这时download就会不起作用。
             * 此时，如果是下载浏览器无法解析的文件，例如.exe,.xlsx..那么浏览器会自动下载，但是如果使用浏览器可以解析的文件，比如.txt,.png,.pdf....浏览器就会采取预览模式
             * 所以，对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type: application/octet-stream，如果为application/pdf浏览器则会判断文件为 pdf ，自动执行预览的策略)
             * 
             * Nginx不能设置一下配置
             * if ($request_filename ~* ^.*?\.(txt|pdf|doc|xls)$){  
             *   add_header Content-Disposition: 'attachment;';  
             *}
             */
            fileName && el.setAttribute('download', fileName);
            el.href = url;
            console.log(el);
            document.body.appendChild(el);
            el.click();
            document.body.removeChild(el);
        },

        /**
         * ajax实现文件下载、获取文件下载进度
         * @param {String} method - 请求方法get/post
         * @param {String} url
         * @param {Object} [params] - 请求参数，{name: '文件下载'}
         * @param {Object} [config] - 方法配置
         */
        downLoadAjaxEvt(url, method = 'get', params, config) {
            let _this = this;
            const _method = method.toUpperCase();
            const _config = Object.assign({
                contentType: _method === 'GET' ? 'application/x-www-form-urlencoded' : 'application/json',  // 请求头类型
                fileName: '未知文件',                                        // 下载文件名(必填，若为空，下载下来都是txt格式)
                async: true,                                                // 请求是否异步-true异步、false同步
                token: ''                                                   // 用户token
            }, config);
            const queryParams = this.transformRequestData(_config.contentType, params);
            const _url = `${url}${_method === 'GET' && queryParams ? '?' + queryParams : ''}`;
            const ajax = new XMLHttpRequest();
            ajax.open(_method, _url, _config.async);
            if(_config.token != ''){
                ajax.setRequestHeader('Authorization', _config.token);
            }
            ajax.setRequestHeader('Content-Type', _config.contentType);
            // responseType若不设置，会导致下载的文件可能打不开
            ajax.responseType = 'blob';
            // 获取文件下载进度 如果需要更改显示下载进度在这里处理
            // 显示下载信息
            _this.downloadMsg();
            
            // 进度监控
            ajax.addEventListener('progress', (progress) => {
                // console.log('progress',progress)
                let percentage = 0.1
                let msg = `正在下载，请耐心等待...`;
                if(progress.total != 0){
                    percentage = ((progress.loaded / progress.total) * 100).toFixed(2);
                    msg = `下载进度 ${percentage}%...`;
                }else{
                    if(progress.target.response && progress.target.response !=null){
                        percentage = ((progress.loaded / progress.target.response.size) * 100).toFixed(2);
                        
                    }
                }
                let m = document.getElementById('downloadM')
                if(percentage<=99.9){
                    m.textContent = msg
                    // console.log(msg);
                }else{
                    // 移除蒙版
                    let d = document.getElementById('downloadMsgId');
                    if(d){
                        setTimeout(()=>{
                            document.body.removeChild(d);
                        },600)
                    }
                }
            });

            // 结束监听
            ajax.addEventListener('loadend', ()=>{
                // 移除蒙版
                let d = document.getElementById('downloadMsgId');
                if(d){
                    setTimeout(()=>{
                        document.body.removeChild(d);
                    },600)
                }
            });

            // 传输完成，所有数据保存在 response 中
            ajax.onload = function () {
                if (this.status === 200 || this.status === 304) {
                // 通过FileReader去判断接口返回是json还是文件流
                const fileReader = new FileReader();
                fileReader.onloadend = () => {
                    if (ajax.getResponseHeader('content-type').includes('application/json')) {
                        const result = JSON.parse(fileReader.result || '{message: 服务器出现问题，请联系管理员}');
                        alert(result.message);
                    } else {
                        // 两种解码方式，区别自行百度: decodeURIComponent/decodeURI（主要获取后缀名，否则低版本浏览器会一律识别为txt，导致下载下来的都是txt）
                        let _fileName = decodeURIComponent((ajax.getResponseHeader('content-disposition') || '; filename=未知文件').split(';')[1].trim().slice(9));
                        // 没有的话从url拿文件名
                        if(_fileName == '未知文件'){
                            let num = url.lastIndexOf('/')+1
                            let name = decodeURIComponent(url.substring(num))
                            _fileName = name
                        }
                        /**
                         * Blob.type一个字符串，表明该 Blob 对象所包含数据的 MIME 类型。如果类型未知，则该值为空字符串。
                         * 对于pdf：type为application/pdf  同时 a标签 不设置download属性, 可以直接预览
                         */
                        const blob = new Blob([this.response]);
                        const href = URL.createObjectURL(blob);
                        _this.downloadEvt(href, _fileName);
                        // 释放一个之前已经存在的、通过调用 URL.createObjectURL() 创建的 URL 对象
                        URL.revokeObjectURL(href);
                    }
                };
                // 调用readAsText读取文件，少了readAsText将不会触发onloadend事件
                fileReader.readAsText(this.response);
                } else {
                alert('服务器出现问题，请联系管理员');
                }
            };
            // send(string): string：仅用于 POST 请求
            ajax.send(queryParams);
        },

        /**
         * 根据header里的contenteType转换请求参数
         * @param {*} contentType 
         * @param {*} requestData 
         * @returns 
         */
        transformRequestData(contentType, requestData) {
            requestData = requestData || {};
            if (contentType.includes('application/x-www-form-urlencoded')) {
                // formData格式：key1=value1&key2=value2，方式二：qs.stringify(requestData, {arrayFormat: 'brackets'}) -- {arrayFormat: 'brackets'}是对于数组参数的处理
                let str = '';
                for (const key in requestData) {
                    if (Object.prototype.hasOwnProperty.call(requestData, key)) {
                        str += `${key}=${requestData[key]}&`;
                    }
                }
                return encodeURI(str.slice(0, str.length - 1));
            } else if (contentType.includes('multipart/form-data')) {
                const formData = new FormData();
                for (const key in requestData) {
                    const files = requestData[key];
                    // 判断是否是文件流
                    const isFile = files ? files.constructor === FileList || (files.constructor === Array && files[0].constructor === File) : false;
                    if (isFile) {
                        for (let i = 0; i < files.length; i++) {
                        formData.append(key, files[i]);
                        }
                    } else {
                        formData.append(key, files);
                    }
                }
                return formData;
            }
            // json字符串{key: value}
            return Object.keys(requestData).length ? JSON.stringify(requestData) : '';
        },

        /**
         * 下载进度提示
         */
        downloadMsg(){
            const d = document.createElement('div');
            d.setAttribute('id', 'downloadMsgId');
            d.style.display = 'block';
            d.style.height = '100vh';
            d.style.width = '100%';
            d.style.position = 'fixed';
            d.style.top = '0';
            d.style.left = '0';
            d.style.zIndex = '99';
            d.style.display = 'flex';
            d.style.alignItems = 'center';
            d.style.justifyContent = 'center';
            d.style.backgroundColor = 'rgba(0,0,0,0.35)';
            const m = document.createElement('div');
            m.setAttribute('id', 'downloadM');
            m.style.display = 'block';
            m.style.padding = '24px';
            m.style.borderRadius = '5px';
            m.style.backgroundColor = '#fff';
            m.textContent = '正在下载，请耐心等待...'
            d.appendChild(m);
            document.body.appendChild(d);
        },
    }


    export {
        fileDownload
    }